package ecg.util;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.HashMap;
import java.util.Calendar;

import devpia.dextupload.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DextUpload 
{
	private static DextUpload singleton;
	private Map map = new HashMap();
	private Calendar cal;
	
	private DextUpload(){}
	
	public static DextUpload getInstance()
	{
		if(singleton == null)
		{
			singleton = new DextUpload();
		}
		
		return singleton;
	}
	
	
	// 기본적인 업로드 메서드.
	public Map defaultUpload(HttpServletRequest request, HttpServletResponse response, String uploadDir) throws Exception
	{
		FileUpload fileUpload = new FileUpload(request, response, "UTF-8");
		
		
	
	
		// 컨텍스트 루트 경로.
		String contextPath = request.getSession().getServletContext().getRealPath("");
		String fullPath = request.getSession().getServletContext().getRealPath(uploadDir);
		
		//System.out.println(strPath + File.separator + "dextuploadj.config");
		
		// 정품 혹은 평가판의 만료일을 판단하기 위한 라이센스 파일의 위치를 지정합니다.
		fileUpload.setLicenseFilePath(contextPath + File.separator + "dextuploadj.config");
		
		// 업로드할 폴더가 없으면 폴더를 자동으로 생성한다.
		fileUpload.setAutoMakeFolder(true);
		
		
		// 파일 용량 제한.
		this.setFileSize(fileUpload);
		
		
		// 프로그래스바 설정.
		fileUpload.SetProgress(Integer.parseInt(request.getQueryString()));
		System.out.println("쿼리스트링: " + request.getQueryString());
		
		// 업로드 시작. 지정된 폴더("/")에 임시 파일을 생성한다.
		// 임시 파일을 생성/쓰기 할 수 없다면 실패 할 수 있다.
		// 아래처럼 임시 폴더를 지정하지 않으면 자바에서 제공하는 임시 폴더를 사용한다.
		// fileUpload.UploadStart();
		fileUpload.UploadStart(fullPath);
		
		// 업로드 된 파일 아이템을 얻는다. 
		// "upload"은 BasicUpload.jsp에서 <input type="file" name="upload">에 지정한 값이다.
		FileItem item = fileUpload.getFileItem("upload");
		
		
		
		if(item != null)
		{
			if(item.IsUploaded())
			{
				
				// 지정된 경로에 파일을 저장한다.
				// 두 번째 인자는 덮어쓰기 유무. true = 덮어쓰기
				//item.Save(fullPath, true);
				
				cal = Calendar.getInstance();
				
				// 파일명으로 사용할 날짜 지정.
				String today = String.format("%04d-%02d-%02d %02d:%02d:%02d", 
				cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH), 
				cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
				
				map.put("fileUpload",fileUpload);
				map.put("item",item);
				
				// 변경된 파일에 확장자를 붙이기위해 확장자명을 구한다. 
				String file_ext = item.getFileName().substring(item.getFileName().lastIndexOf(".")+1);
				 
				//지정된 경로(strPath)에 지정된 파일 이름(Test.tmp)으로 파일을 저장한다. 날짜로 된 파일명을 입력하고 원본 파일명은 DB에 저장할때 사용가능.
				//기존에 동일한 파일명이 존재하면 덮어쓴다.
				//item.SaveAs(fullPath + "/" + today + "." + file_ext, true);
				
				
				
				
				////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				/*
				 * 업로드된 원본 파일명을 변경하여 저장하는 부분이 안되고 있음. 이부분부터 다시 해결해야됨.
				
				 */
				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				
				//아래처럼 저장 경로와 파일명을 각각 입력 할 수 있다. 날짜로 된 파일명을 입력하고 원본 파일명은 DB에 저장할때 사용가능.
				item.SaveAs(fullPath, today + "." + file_ext, true);
				
				
				System.out.println("File Name : " +item.getFileName());
				System.out.println("Form Name : " + item.getFormName());
				System.out.println("MimeType : " + item.getMimeType());
				System.out.println("Value : " + item.getValue());
				System.out.println("Length : " + item.length());
				System.out.println("Saved File Name : " + item.getLastSavedFileName());
				System.out.println("Saved File Path : " + item.getLastSavedFilePath());
				
			}
			else
			{
				System.out.println("파일이 업로드 되지 않았습니다.");				
			}
		}
	
	
		/*
		 * 
		// 모든 FileItem 클래스의 Save() 메소드를 사용해서 저장된 모든 파일을 삭제한다. 트랙잭션 롤백 구성시, 사용하면 됨.
		fileUpload.DeleteSavedFiles();
		*/
		
		
		// 종료 시에 반드시 자원을 해제해야 한다.
		// 그렇지 않으면 임시 파일이 삭제되지 않고 남을 수 있다.
		fileUpload.dispose();
		
		
		return map;
	}

	
	private void setFileSize(FileUpload fileUpload) throws Exception
	{
		fileUpload.setMaxFileLength(1*1024*1024*100);
		fileUpload.setMaxTotalLength(1*1024*1024*100);
	}
}

